// 生成模拟数据
function generateData(k, b, numPoints, noiseLevel) {
  const data = [];
  for (let i = 0; i < numPoints; i++) {
      const x = Math.random() * 10; // 随机生成 x 值
      const noise = (Math.random() - 0.5) * noiseLevel; // 添加噪声
      const y = k * x + b + noise;
      data.push({ x, y });
  }
  return data;
}

// 定义梯度下降函数
function gradientDescent(data, learningRate, numIterations) {
  let k = 0; // 初始化斜率
  let b = 0; // 初始化截距

  const n = data.length;

  for (let iter = 0; iter < numIterations; iter++) {
      let gradientK = 0;
      let gradientB = 0;

      // 计算梯度
      for (let i = 0; i < n; i++) {
          const x = data[i].x;
          const y = data[i].y;
          const prediction = k * x + b;

          gradientK += -2 * x * (y - prediction);
          gradientB += -2 * (y - prediction);
      }

      // 更新 k 和 b
      k -= learningRate * (gradientK / n);
      b -= learningRate * (gradientB / n);
  }

  return { k, b };
}

// 主函数
function main() {
  const trueK = 2; // 真实的斜率
  const trueB = 1; // 真实的截距
  const numPoints = 100; // 数据点数量
  const noiseLevel = 1; // 噪声水平

  // 生成模拟数据
  const data = generateData(trueK, trueB, numPoints, noiseLevel);
  const learningRate = 0.01; // 学习率
  const numIterations = 1000; // 迭代次数

  // 运行梯度下降算法
  const result = gradientDescent(data, learningRate, numIterations);

  console.log(`真实的 k 值: ${trueK}, 预测的 k 值: ${result.k}`);
  console.log(`真实的 b 值: ${trueB}, 预测的 b 值: ${result.b}`);
}

main();
